<html>
    <head>
        <title>Dapper 集成</title>
    </head>
    <body>
        <script>
            //  Dapper 集成

                    /*
                            Dapper是一个简单而轻量级的对象映射器。NET。与其他ORM相比，Dapper的一个关键特性是其高性能。

                            虽然你可以像在ABP应用程序中一样使用Dapper，但还有一个集成包可以简化使用Dapper创建存储库类。

                            ABP的Dapper集成包基于 "Entity Framework Core（EF Core）"。

                            这意味着它假设你将使用Dapper与EF Core混合使用，其中EF Core是主要的数据库提供程序，当你需要微调你的查询并获得最大性能时，你可以使用Dapper。
                    */

                    /*
                        一、安装

                                 你可以使用ABP CLI将Volo. Abp.Dapper包安装到你的项目中。
                                 
                                 在要安装包的.csproj文件夹中执行以下命令：  


                                        "abp add-package Volo.Abp.Dapper"

                                
                                 备注： 如果你有分层解决方案，建议将该包安装到解决方案的数据库层。
                    */

                    /*
                        二、实现Dapper存储库

                                与Dapper交互的最佳方式是创建一个存储库类来抽象你的Dapper数据库操作。

                                以下示例创建一个与People表一起使用的新存储库类：

                                        public class PersonDapperRepository :
                                            DapperRepository<MyAppDbContext>, ITransientDependency // 继承 DapperRepository<T> 类，创建Dapper存储库
                                        {
                                            public PersonDapperRepository(IDbContextProvider<MyAppDbContext> dbContextProvider)
                                                : base(dbContextProvider)
                                            {
                                            }

                                            // 获取所有人的名字
                                            public virtual async Task<List<string>> GetAllPersonNamesAsync()
                                            {
                                                var dbConnection = await GetDbConnectionAsync(); // 获取数据库连接

                                                return (await dbConnection.QueryAsync<string>(
                                                    "select Name from People",
                                                    transaction:  await GetDbTransactionAsync())
                                                ).ToList();
                                            }

                                            // 更新名称
                                            public virtual async Task<int> UpdatePersonNamesAsync(string name)
                                            {
                                                var dbConnection = await GetDbConnectionAsync(); // 获取数据库连接
                                                return await dbConnection.ExecuteAsync(
                                                    "update People set Name = @NewName",
                                                    new { NewName = name },
                                                    await GetDbTransactionAsync()
                                                );
                                            }
                                        }

                                看下这个类：

                                          ①、  它继承自DapperRepository类，该类为数据库操作提供了有用的方法和属性。

                                               它还实现了IUnitOfWorkEnabled接口，因此ABP通过实现动态代理（又名拦截）使数据库连接（以及请求时的事务）在方法体中可用。


                                          ②、  它获取一个IDbContextProvider<MyAppDbContext>对象，其中MyAppDbContext是你的Entity Framework CoreDbContext类的类型。
                                              
                                               。它应该按照EF Core文档中的说明进行配置。如果你是由ABP的启动模板创建的，那么它应该已经配置好了。

                                          ③、  GetAllPersonNamesAsync和UpdatePersonNamesAsync方法已被设为virtual。这是使拦截过程正常工作所必需的。

                                          ④、  我们已经使用了GetDbConnectionAsync和GetDbTransactionAsync方法来获取当前的数据库连接和事务（由ABP的Unit of Work系统管理）


                                然后你可以注入PersonDapperRepository到任何服务来执行这些数据库操作。

                                如果你想实现分层解决方案，我们建议在你的域层引入一个IPersonDapperRepository接口，稍后在你的数据库中实现，然后注入接口来使用存储库服务。
                    */
        </script>
    </body>
</html>